package othello.core;

import java.util.List;
import java.util.ArrayList;

import java.awt.Point;

public class OthelloUtil{
    private static final int[][] VOLUTE = {
        {-1, -1}, {-1,  0}, {-1,  1}, { 0,  1},
        { 1,  1}, { 1,  0}, { 1, -1}, { 0, -1}
    };

    private static final int X = 0;
    private static final int Y = 1;

    //色colorの石をx、yに置けるかを返す
    public static boolean canPutStone(Board board, int color, int x, int y){
        //すでに別の石があればfalseを返す
        if(!board.isEmptyCell(x, y))
            return false;

        //colroと逆の色
        int reverseColor = -color;

        //全方向にひっくり返せる石があるかチェックする
        for(int[] direction : VOLUTE){
            int dx = x;
            int dy = y;
            int reverseCount = 0;

            while(true){
                //隣の座標に移動
                dx += direction[X];
                dy += direction[Y];

                //隣の石が逆の色でなければループ終了
                if(board.getCell(dx, dy) != reverseColor)
                    break;

                reverseCount++;
            }

            //現在の位置の石の色がcolorでひっくり返せる石の数が0より大きければtrueを返す
            if(board.getCell(dx, dy) == color && reverseCount > 0)
                return true;
        }

        //ひっくり返せる石がなければfalseを返す
        return false;
    }
    
    //色colorの石を置ける場所全ての位置を返す
    public static List<CellPoint> getCanPutList(Board board, int color){
        List<CellPoint> canPutList = new ArrayList<CellPoint>();
        
        for(int y = 1; y <= 8; y++){
            for(int x = 1; x <= 8; x++){
                //置けるかどうかチェックし、置けるならリストに追加
                if(OthelloUtil.canPutStone(board, color, x, y))
                    canPutList.add(new CellPoint(x, y));
            }
        }
        
        return canPutList;
    }
}